package dx.util;

import cn.hutool.poi.excel.ExcelReader;
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;

/**
 * create by duanx 2020/12/21
 *@description： 图片处理工具类
 *@classname: ImgUtil
 *@author: duanx
 *@date: 2020/12/21 13:08
 **/
public class FileUtil {
    private static String basePath = Objects.requireNonNull(Thread.currentThread().getContextClassLoader().getResource("")).getPath();
    private static Logger logger = LoggerFactory.getLogger(FileUtil.class);
//
//    /**
//     * 图片转换类，将图片转换成字符图片200像素以内的背景干净的图片
//     *
//     * @param path 图片路径
//     * ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
//     *                                                                                          .;
//     *                                                                                          .;
//     *                                         .sPPPPksskkkkksp;;p;                             .;
//     *                                      .kPPPPSSPPkkkkPPkksssskkks                          .;
//     *                                    ;kPPPPPSSSSSSPPkPPPPPPkkPPkPPk.                       .;
//     *                                   pPPPPPPPPPSSSSPPkPPSSPPPPkkkkPPPk                      .;
//     *                                  kSSSSPPPPPPPPSPSPkksskPPSSSSPPPPPPk;                    .;
//     *                                 kSSSSSSSSSPks;...;;;....;psPSSSSPPPPPp                   .;
//     *                                kSSSSSSSPksp;..............;psPSSSPPPPPs                  .;
//     *                               sPSSSSSSkp;;... .............;;psPSSPPSPPp                 .;
//     *                              ;PSSSSSPkp;....  ...............;psPSSPPSSP;                .;
//     *                              PSSSSSPkp;...     ...............;pkSSSSSSSk                .;
//     *                             .PSSSSPs;......   ..............;;;;pkSSSSSSP;               .;
//     *                             pSSSSSk;...;;;.;;;p;;.....;ppp;p;psp;pkSSSSSSP               .;
//     *                             pSSSSSk;....;skPPs;;......;;;kPkp.;;;;pPSSSSSPs              .;
//     *                             pSSSSPs....;p;pkk;s...  ...ppsPspsp;;;;PSSSSSSP              .;
//     *                             ;PSPkks......................;;......;;kkPSSSSS;             .;
//     *                             .PSPppp.....      ...................;;spsPSSSSp             .;
//     *                             .SSSs;p;....    ..;;.....;;..........;pspkSSSSSp             .;
//     *                             ;PSSSs;;...... ..;;..;...;;;;.......;;ppPSSSSSSP.            .;
//     *                             pPSSSPss;;.........;sspppppp;......;;;pkSSSSSSSSs            .;
//     *                             PSSSSPSSp;....;..........;.......;;;;sSKSSSSSSSSk            .;
//     *                            .SSSSPPSSS;;....psskkkkkkkskkss;..;;;pSSSSSSSSSSSP.           .;
//     *                            pSSSSPSSSSS;;;...;;;pppppspp;;;..;;;pSKSSSSSSSSSSPp           .;
//     *                            PSSSSPSSSSKKs;;.......;;;;;;....;;;sSKKKSSSSSSSSSPs           .;
//     *                           .SSSSSSSSSSKKKSp;;.............;;;pSSSKKKSSSSKSSSPSsp          .;
//     *                           sSSSSSSSKKKKKKKsppp;;;.;.;;;;;;;;;pSKKKSKSSSKKSSSkSPs.         .;
//     *                          .PSSSSSKKKKKKKKSp;.;;pppppp;;;;;;;;pPSKKKKKSSSKKSSSsPkp.        .;
//     *                          kSSSSSKKKKKKKSSPp;.....;;;;;;;;;;;;psKKKSKKKSKKKSSSs;Ps;        .;
//     *                         sSSSSSKKKKKKKSSKs;;;...........;;;;pppSKKSSKKKSKKSSSS;kkpp       .;
//     *                        ;PSSSSKKKKKSSSSSSPp;;;............;;;pPSSSSSSSSKKKKSSSssPk;       .;
//     *                        PSSKSSKSSSSSSSSSSSkp;;............;;pkPPSSSSSSSSSSSSSSSskSp;      .;
//     *                       pPSSSSSSSSSSSSSSSSSPp;;;............  ..PSSSSSSSSSSSSSSSSSPk;      .;
//     *                  .skPPSSSSSSSSSSSSSSSSSSSSp                 .kSSSSSSSSSSSSSSSSSSSPPkkks; .;
//     *             .;kkPPPPPSSSSSSSSSSSSSSSSSSSSSP.               .pSSSSSSSSSSSSSSSSSSSPPPPPPPPP;;
//     *             pPPPPPPSSSSSSSSSSSSSSSSSSSSSSSSk               ;PSSSSSSSSSSSSSSSSSSSPPPPPPPPP;;
//     *             pSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSs             .PSSSSSSSSSSSSSSSSSSSSPPPPPSSSS;;
//     *             pSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSs            PSSSSSSSSSSSSSSSSSSSSSPPPSSSSSS;;
//     *             pSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSp          kSSSSSSSSSSSSSSSSSSSSSSPPSSSSSSS;;
//     *             pSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSP;        kSSSSSSSSSSSSSSSSSSSSSSPPSSSSSSSS;;
//     *             pSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSP.      kSSSSSSSSSSSSSSSSSSSSSSPPSSSSSSSSS;;
//     *             pSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSk.    kPSSSSSSSSSSSSSSSSSSSSSSPSSSSSSSSSS;;
//     *             pSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSk;  kPSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS;;
//     *             pSSSSSSSSSSSSSSPSSSSSSSSSSSSSSSSSSSSSSk.PSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS;;
//     *             pSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS;;
//     *             pSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS;;
//     *             pSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS;;
//     *             pSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSKSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS;;
//     *             pSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSK;;
//     *             pSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSkPPPSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSKS;.
//     *             pSSSKSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSKSPPSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSKKS;.
//     * @date: 2021/1/2
//     */
//    public static void createAsciiPic(final String path) {
////      final String base = "@#&$%*o!;.";
////      字符串由复杂到简单
////        final String base = "KSPkyl;.";
//        final String base = "beatYou;.";
//        try {
//            final BufferedImage image = ImageIO.read(new File(path));
//            System.out.println("W:" + image.getWidth() + " H:" + image.getHeight());
//            int addNum = 2;
//            for (int y = 0; y < image.getHeight(); y += addNum) {
//                for (int x = 0; x < image.getWidth(); x += 1) {
//                    final int pixel = image.getRGB(x, y);
//                    final int r = (pixel & 0xff0000) >> 16, g = (pixel & 0xff00) >> 8, b = pixel & 0xff;
//                    final float gray = 0.299f * r + 0.578f * g + 0.114f * b;
//                    final int index = Math.round(gray * (base.length() + 1) / 255);
//                    System.out.print(index >= base.length() ? " " : String.valueOf(base.charAt(index)));
//                }
//                System.out.println();
//            }
//        } catch (final IOException e) {
//            e.printStackTrace();
//        }
//    }

//    /**
//     * 将CFile转换成File
//     * @param commonsMultipartFile CFile
//     * @return file
//     */
//    @NotNull
//    public static File commonsMultipartFileToFile(@NotNull CommonsMultipartFile commonsMultipartFile)  {
//        File file = new File(Objects.requireNonNull(commonsMultipartFile.getOriginalFilename()));
//        try {
//            commonsMultipartFile.transferTo(file);
//            logger.debug("文件转换成功");
//        } catch (IOException e) {
//            e.printStackTrace();
//            logger.error(commonsMultipartFile.getOriginalFilename()+"转换失败");
//            logger.error(e.toString());
//        }
//        return file;
//    }

    /**
     * 获取一个随机有规则的文件名称
     * 时间+5位随机数
     * @return 文件名称
     */
    @NotNull
    public static String getRandomFileName() {
        String randomName = TimeStringUtil.dateFormatToString(new Date(),"yyyyMMddHHmmss")+RandomUtil.getRandom(5);
        logger.debug("获取随机的文件名称-==>"+randomName);
        return randomName;
    }

    /**
     * 创建所涉及的目录
     * /dx/work/image 都要创建出来
     * @param targetAddr 目录
     */
    public static void makeDirePath(String targetAddr) {
         String filePath = PathUtil.getImgBasePath()+targetAddr;
         File file = new File(filePath);
         if (!file.exists()){
             if (file.mkdirs()){
                logger.debug("创建文件成功，路径："+filePath);
             }else {
                 logger.error("创建文件失败，路径："+filePath);
                 throw new IllegalArgumentException("路径有误");
             }
         }
    }

    /**
     * 获取扩展名
     * @param fileName 文件
     * @return 文件扩展名称
     */
    @NotNull
    public static String getFileExtension(@NotNull String fileName) {
        String extension = fileName.substring(fileName.lastIndexOf("."));
        logger.debug("获取文件扩展名-==>"+extension);
        return extension;
    }

    /**
     * 图片加水印和进行一个缩略,新生成的图片相对路径
     *
     * @param fileInputStream spring自带的文件对象
     * @param targetAddr           保存的路径
     * @return 生成文件的相对路径
     */
    @NotNull
    public static String generateThumbnail(@NotNull InputStream fileInputStream, String targetAddr,String fileName){
        //统一命名，获取一个随机的文件名称
        String realFileName = getRandomFileName();
        //获取文件的扩展名称
        String extension = getFileExtension(fileName);
        //创建文件的路径
        makeDirePath(targetAddr);
        //获取文件相对路径
        String relativeAddr = targetAddr + realFileName + extension;
        logger.debug("complete addr is:"+ PathUtil.getImgBasePath()+relativeAddr);
        //创建目标文件
        File dest = new File(PathUtil.getImgBasePath() + relativeAddr);
        try {
            Thumbnails.of(fileInputStream)
                    .size(200, 200)
                    .watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File(basePath + "/watermark.jpg")), 0.5f)
                    .outputQuality(1f)
                    .toFile(dest);
            logger.debug("生成图片缩略图成功，路径：" + dest.getPath());
        } catch (IOException e) {
            logger.error("生成图片缩略图失败");
            logger.error(e.toString());
            e.printStackTrace();
        }
        return realFileName;
    }

    /**
     * 获取文件夹下所有文件
     * @param path 路径
     * @return
     */
    public static List<String> getFiles(String path) {
        List<String> fileNames = new ArrayList<>();
        File file = new File(path);
        // 如果这个路径是文件夹
        if (file.isDirectory()) {
            // 获取路径下的所有文件
            File[] files = file.listFiles();
            assert files != null;
            for (File value : files) {
                // 如果还是文件夹 递归获取里面的文件 文件夹
                if (value.isDirectory()) {
                    System.out.println("目录：" + value.getPath());
                    getFiles(value.getPath());
                } else {
                    fileNames.add(value.getPath());
                    System.out.println("文件：" + value.getPath());
                }
            }
        } else {
            fileNames.add(file.getPath());
            System.out.println("文件：" + file.getPath());
        }
        return fileNames;
    }


//    /**
//     * 将输入流转换成文件
//     * @param inputStream 输入流
//     * @param file 文件
//     */
//    public static void inputStreamToFile(InputStream inputStream,File file){
//        OutputStream outputStream = null;
//        try {
//            outputStream = new FileOutputStream(file);
//            int bytesRead;
//            byte[] bytes = new byte[1024];
//            while ((bytesRead = inputStream.read(bytes))!=-1){
//                outputStream.write(bytes,0,bytesRead);
//            }
//        }catch (Exception e){
//            throw new RuntimeException("调用inputStreamToFile产生异常"+e.toString());
//        }finally {
//            try {
//                if (outputStream!=null){
//                    outputStream.close();
//                }
//                if (inputStream!=null){
//                    inputStream.close();
//                }
//            }catch (IOException e){
//                throw new RuntimeException("关闭io异常"+e.toString());
//            }
//
//        }
//    }


    public static void main(String[] args) {
        //File file = new File("E:/data/desktop/常用文件/图片/330db9e8f648b1e8e4c68492b563035.jpg");
        //generateThumbnail(file,"yangliu/");
        String path = "E:\\data\\desktop\\各村导入表";
        List<String> fileNames = getFiles(path);

    }
}



